<?php
/**
 * encrypt.libaray.php
 * @Copyright lemonCarlJ All rights reserved.
 * @License http://www.56code.com/License.txt
 * @Version 1.0.0
 * @Email rpgshifa@aliyun.com
 */
namespace SF\libaray;

class encrypt
{
    /**
     * 加密方式
     * @var string
     */
    public $method = 'AES-128-CBC';
    
    /**
     * 操作选项
     * @var string
     */
    public $options = OPENSSL_RAW_DATA;
    
    /**
     * 向量
     * @var string
     */
    protected $iv;
    
    /**
     * 初始化向量
     * @param string $string 向量字符串 [ null ]
     */
    public function __construct( $string = null )
    {
        $this->create_iv( $string );
    }
    
    /**
     * 加密数据
     * @param string $data 加密数据
     * @param string $key 密钥
     * @return string|boolean 返回加密数据或者加密失败
     */
    public function encode( $data, $key )
    {
        if( $encode = openssl_encrypt( $data, $this->method, $key, $this->options, $this->iv ) )
        {
            return base64_encode( $encode );
        }else{
            return false;
        }
    }
    
    /**
     * 解密数据
     * @param string $data 加密数据
     * @param string $key 密钥
     * @return string|boolean 返回加密数据或者加密失败
     */
    public function decode( $data, $key )
    {
        if( $data = base64_decode( $data ) )
        {
            return openssl_decrypt( $data, $this->method, $key, $this->options, $this->iv );
        }else{
            return false;
        }
    }
    
    /**
     * 创建新向量
     * @param string $string 向量字符串 [ null ]
     * @desc string为null则自动生成随机字符串
     */
    public function create_iv( $string = null )
    {
        $iv_length = openssl_cipher_iv_length( $this->method );
        $this->iv = $string ? substr( md5( $string ), $iv_length == 16? 8: 0, $iv_length ) : openssl_random_pseudo_bytes( $iv_length );
    }
}